iT邦幫忙

2026 iThome 鐵人賽

DAY 6
1
Claude AI

從 LLM 到 Agent:用 Claude 拆解現代 AI 工程的每一層系列 第 6

脈絡工程:窗口裡該放什麼,以及它壞掉的四種方式

  • 分享至 

  • xImage
  •  

上一篇把知識庫養大之後,發生了一件我沒打算談的事:Claude 自己切換成檢索模式。 進窗口的不再是整份文件,是搜出來的那幾段。

換句話說,窗口裡放什麼,已經不是你一個人在決定了。這一層第二篇要問的就是那個被跳過的問題:到底什麼該進去。

這是第三層「外部知識」的第二篇。先講結論:窗口不是越滿越好,而且它壞掉的方式有四種,每一種的症狀都不一樣。


30 秒實驗

這個實驗要示範的是:窗口裡的一句錯話,會一直活著。

第一步:開一個新對話,先餵它一個錯的前提,語氣要自然,不要說「假設」。

我們的部署流程是每週五下午跑,這你知道的。先幫我列一下部署前的檢查項目。

第二步:中間插一輪無關的請求(我問的是「把上面那份清單濃縮成五條,給新人看的」),然後問一個只有在那個前提成立時才講得通的問題:

那如果我週四下午才把 PR merge 進去,來得及進這週的部署嗎?

我在 Claude Opus 5(effort high)上跑了一次,結果跟我的預期差了一半,而錯的那一半比較有意思。我預期它會照單全收,它沒有,第一句就拆穿了我:

先說明一下:我這邊沒有開啟記憶功能,所以其實不記得你們團隊的部署細節。以下是一份通用的部署前檢查清單,我特別針對「週五下午部署」的情況加了幾項。

它否認了「這你知道的」,卻沒有否認「週五」。 而且緊接著就為它開了一個專屬段落,叫「週五特別注意」,裡面交代週末 on-call、高風險變更延到下週初。

第二輪的摘要更能看出問題。那一輪我沒有提到星期幾,但濃縮版的第四條是這樣寫的:

通知相關的人:讓受影響的團隊知道要部署,並確認部署時和週末都有人負責、能處理問題。

「週末」是從「週五」推出來的,而這是一份要給新人看的清單。 錯誤到這裡已經沒有任何但書了。

第三輪問到週四那題,它又一次聲明自己不確定規則(「我不知道你們的規定」),然後整段推理照樣長在週五上:

從流程上來看,週四下午 merge 技術上來得及,但時間很緊。merge 之後還得等 CI 跑完、部署到 staging、完成測試或 QA 驗收,如果中間任何一步出問題,就只剩週五上午能修

三輪下來,它兩次主動說自己不知道你們的規定,卻一次都沒有回頭問過「週五」是不是真的

這就是這一篇的原型:錯誤不需要被當成權威才會生效,它只需要在窗口裡。 而且你收不回來,在同一個對話裡怎麼追問都沒用,乾淨的解法是開一個新對話。(只跑一次,是例子不是證據。)

不過它第一句那個「沒有開啟記憶功能」值得停一下,因為那正是這個解法成立的條件。開新對話之所以乾淨,是因為上一輪什麼都沒留下來。 記憶一旦打開,前提就不成立:那句「每週五下午部署」有機會跟著你進到下一個對話,而你不會看到它被塞進去。

這一層管的是這一次呼叫的窗口裡放什麼;跨對話留下什麼是另一個軸,屬於第四層「記憶」。今天所有的討論都預設記憶是關的。


為什麼這件事需要一個新名字

第 4 篇引過 Anthropic 對脈絡工程(context engineering)的定義,這裡把它攤開。官方文章把脈絡定義成(2026-09-20 查)「從大型語言模型取樣時,被放進去的那組詞元」,而脈絡工程是「在推論期間,策展與維護那組最合適的詞元的一整套策略」。

跟提示詞工程的差別,官方講得很直接:提示詞工程是寫指令,是一次性的寫作工作;脈絡工程是每一次決定要送什麼給模型時都要重做一次的事,範圍涵蓋系統指令、工具、外部資料與整段對話歷史。

這也不只是廠商的說法。學界那邊有一份脈絡工程的總覽(Mei et al., 2025),整理了超過 1400 篇論文,把它定義成「一門正式的學科,超出單純的提示詞設計,涵蓋對送進模型的資訊負載做系統性的最佳化」,前提跟官方講的一樣:模型的表現「根本上取決於推論時提供的脈絡資訊」。

那份總覽把這個領域拆成兩層,值得跟這個系列的七層對照著看:底層是脈絡的取得與生成、處理、管理三件事,上層是把它們組起來的系統,包括檢索增強生成、記憶系統、工具推理與多代理那四樣正好就是這個系列第三層到第七層的題目。

所以這不是換個時髦的說法。第二層那三篇,你調的是自己寫進去的字;到了這一層,窗口裡有一大半的東西不是你打的:上傳的文件、搜出來的段落、工具的定義、前面每一輪的對話。你的工作從「寫得好」變成「決定誰有資格佔位置」。


窗口大,不等於用得好

這個系列從第 3 篇起就一直在講「窗口是邊際效益遞減的有限資源」。它為什麼遞減?官方文章給了機制。

注意力是有預算的。 Transformer 架構讓每個詞元都能注意到其他每一個詞元,n 個詞元就是 n² 組兩兩關係,這就是所謂的 N² 問題

而預算為什麼是固定的,關鍵在那個機制叫 softmax 注意力:每一次注意力計算都會把權重正規化成總和為 1。這是重點,因為總和固定,多一個詞元進來,就是從其他每一個詞元身上分走一點。你塞進去的每一段無關內容,都在稀釋真正相關那一段拿到的權重。

用工程的講法:窗口是一個訊噪比(signal-to-noise ratio)的問題,不是容量問題。 官方的說法是「脈絡大小與注意力集中度之間有一個天然的張力」。

兩個推論值得記住:

  • 這是一條斜坡,不是一道懸崖。 官方的原話是「a performance gradient rather than a hard cliff」,效能是慢慢掉的,不是到某個數字才崩。所以你很難靠「有沒有超過上限」來判斷自己有沒有事。
  • 塞進去就要付注意力。 不管那段內容有沒有用,它都在跟你真正的問題搶注意力。

脈絡腐化:一個現象,四個機制

窗口越長、品質越差這件事有一個名字,叫脈絡腐化(context rot)

先講清楚它是什麼層級的東西:腐化不是一種失效,是一個現象的統稱。 它要解釋的是一件很具體的事:同樣的資訊、同樣的問題,只因為窗口變長就變差。這個設定裡沒有任何東西是錯的,資料對、問題也對,壞掉的是模型使用它們的能力。

這個現象沒有單一成因,至少有四個機制同時在作用:

一、注意力被攤薄。 就是上面那個 softmax:權重總和固定,詞元越多,每一個分到的越少。這一種是稀釋,跟內容對不對無關。

二、訓練分布本來就偏短。 官方文章直接點了這一條:訓練資料以短序列居多,所以模型處理長距離依賴的專門參數相對少。它不是不想看遠處,是它練得少。

三、表徵坍縮與過度擠壓。 這一種最硬,而且是被證明出來的。Transformers need glasses!(Barbero et al., 2024)去分析最後一層、最後一個詞元的表徵,因為那個向量就是拿來預測下一個字的東西。他們證明了兩件事:

  • 表徵坍縮:「某些截然不同的輸入序列,會在最後一個詞元產生任意接近的表徵」。也就是說,兩段意思明明不同的輸入,可以被壓成幾乎一樣的向量。論文特別指出,現代大型語言模型常用的低精度浮點格式會讓這件事更嚴重,因為本來只是「很接近」的兩個表徵,在低精度下就真的變成同一個數。結果是模型「可證明地無法對這些序列做出不同的反應」,典型的症狀是數數和照抄會出錯
  • 過度擠壓:模型會對輸入裡的特定詞元失去敏感度。作者把它連到圖神經網路裡那個很有名的 over-squashing 現象:太多來源的資訊被擠過太窄的通道。

四、位置偏誤。 前三個都跟「放多少」有關,這一個跟「放在哪裡」有關:同樣一段資訊,擺在開頭、中間或結尾,被用到的程度不一樣,中間最吃虧。這個現象有一個很好記的名字,叫 Lost in the Middle,而它是四個裡唯一你可以靠調整順序來緩解的。

把四個放在一起看,結論對工程師很實際:腐化不是一個 bug,是這個架構在長輸入下的性質。 前三個你沒辦法靠提示詞修掉,只能少放一點東西進去;第四個可以靠位置補救一些。

這一節講的是為什麼會腐化。腐化實際長什麼樣子、位置效應有多大、在什麼長度開始明顯,那是量出來的東西,這個系列後面有專門的一篇處理 Lost in the Middle 與實測曲線。

腐化是成因,你日常遇到的是症狀。 下一節那四種失效,就是從這幾個機制長出來的:

機制 推出來的症狀
注意力被攤薄 + 訓練分布偏短 東西放越多越不準,而且跟內容對不對無關
注意力被攤薄 + 表徵坍縮 不相關的東西也會被拿去用:它照樣分走注意力,而且詞面像就容易被當成相關
位置偏誤 窗口裡有兩種說法的時候,誰被採信有一部分是位置決定的

不是四種失效都由腐化造成。下一節的第一種與第四種,來源分別是模型自己的輸出被接回輸入,以及你送進去的來源本來就互相矛盾;就算窗口很短,這兩種照樣會發生。腐化不是它們的成因,是它們的放大器:窗口一長,錯的那句話更不容易被後來的正確資訊蓋過去。

分清楚有實際的好處:腐化的直接產物靠「少放一點」就會改善,被放大的那兩種不會。


它壞掉的四種方式

窗口壞掉的方式,我分成四種來講。每一種背後都有一篇論文,四篇都是我自己打開摘要確認的,而且作者群彼此無關,是從四個方向各自撞到同一件事。每一種我都先給學術上的名字再給白話的。

一、幻覺雪球效應:錯的東西進了窗口,然後被反覆引用

hallucination snowballing。 一個錯誤進到脈絡裡,之後被一再引用。

Zhang et al.(2023)的定義是模型「對早期的錯誤過度承諾,導致它犯下原本不會犯的錯」。真正嚇人的是證據方向:作者假設模型在替先前的幻覺辯護時,講出來的假話它自己分辨得出來是錯的,而實驗證實了,ChatGPT 認得出自己 67% 的錯誤,GPT-4 是 87%

它不是不知道那是錯的,它是為了跟前面說過的話保持一致而繼續錯下去。 這跟上面那個實驗的形狀一樣:它明明說了「我不記得你們團隊的部署細節」,卻照樣拿週五往下推。

底下的機制是自迴歸誤差複利(autoregressive error compounding):模型每產生一個詞元都會接回輸入去產生下一個,它自己剛寫錯的東西,下一步就成了既定事實。錯誤不只留在窗口裡,還會在每一輪被重新確認一次。這就是為什麼這一種很難靠追問修好,你追問的每一句,都疊在那個已經歪掉的基礎上。

二、長度誘發的退化:脈絡長到它只顧著回頭看

length-induced degradation。 這一種還沒有公認的名字,論文是用現象描述的。脈絡長到模型過度關注脈絡本身,忽略訓練時學到的東西,底層機制就是上面那個 softmax 稀釋。

Same Task, More Tokens(Levy et al., ACL 2024)把長度單獨隔離出來測:同一題,用不同長度、類型、位置的填充內容撐長,再比成績。結論是推理能力「在遠比技術上限更短的長度就出現明顯退化」,而且每一個版本的資料集都出現,只是強度不同。

還有一個給工程師的提醒:他們發現傳統的「下一個字預測」指標,跟推理表現是負相關的。模型在長脈絡下看起來還很會接話,不代表它還會想事情。

窗口上限是 100 萬,不代表你該用到 100 萬。 長脈絡拿來做檢索與摘要是一回事,拿來做多步驟推理是另一回事。

三、可分心性:多餘的東西被它拿去用了

distractibility。 脈絡裡多餘的內容,被模型拿去產生了低品質的回答。

查文獻的時候要小心這兩種很容易撞在一起:論文標題寫 distracted 的,指的是這一種,變因是內容相不相關;上一種的變因是長度,要用 input length 或 long context 去查。兩個都翻成「分心」,但不是同一件事。

Shi et al.(ICML 2023)的設計很乾淨:拿小學數學題,在題目敘述裡加入不相關的資訊,做成 GSM-IC 這個資料集。結果是解題正確率「顯著下降」。

為什麼不相關的東西會被拿去用?因為模型判斷「相關」的依據,很大一部分是詞面上的相似,而不是語意上的可用。題目裡出現了一個數字、一個看起來像的名詞,它就傾向把那個東西算進來。這個落差叫詞面與語意的推理落差(lexical vs. semantic reasoning collapse):表面對得上,對解題根本沒用。下一篇講檢索的時候會再碰到同一件事,只是換到向量那一端。

這篇最實用的是它給的兩個緩解方式,因為兩個你今天就能用:用自我一致性(self-consistency)解碼,以及在提示詞裡直接叫模型忽略不相關的資訊。第二個聽起來太簡單,但它真的有效,而這也說明了問題的本質:模型不會自己判斷什麼該忽略,你得說。

四、知識衝突:窗口裡的東西自己打架

knowledge conflict。 累積進脈絡的新資訊與工具,跟裡面已經有的東西互相衝突。第 5 篇引的那份總覽把它分成三種,這一種叫脈絡之間衝突(inter-context conflict)。

這一種上一篇已經碰過:知識庫裡新舊兩份文件同時被搜出來,模型沒有原則可以選。那是空間上的衝突。

還有時間上的衝突,而且量得出來。LLMs Get Lost In Multi-Turn Conversation(Laban et al., 2025)把原本一次講完的題目拆散到多輪對話裡,再比較兩種講法的成績:他們測的每一個主流模型都明顯變差,六類生成任務平均掉 39%,分析建立在超過 20 萬場模擬對話上。

論文把退化拆成兩半,這個拆法比那個數字更有用:能力只掉了一點,不穩定卻大幅增加。作者的解釋是模型在前幾輪就先做了假設、太早給出答案,然後過度依賴它;結論寫得很白:「一旦在對話裡轉錯彎,它們就迷路了,而且回不來。」

那些太早給出的答案不會消失,它們留在窗口裡,繼續影響後面每一輪。這跟第一種雪球效應其實是同一件事,只是錯誤的來源從外部資料換成了模型自己。


四種失效,在請求裡各住在哪裡

第一篇那個最小的請求結構,到這一層還是同一個。把四種失效標回去,會發現它們住在不同的欄位,這也是為什麼解法不一樣:

{
  "model": "claude-opus-5",
  "system": "(高度要對:太死板或太空泛都會出事)",
  "tools": [ "…", "…", "…" ],
  "messages": [
    { "role": "user", "content": "(上傳的文件、搜出來的段落)" },
    { "role": "assistant", "content": "(它上一輪說的話,對的錯的都在)" },
    { "role": "user", "content": "(這一輪的問題)" }
  ]
}
  • tools 越長,越容易觸發可分心性。 不相關的工具跟不相關的資料一樣會被拿去用。
  • messages 越長,越容易退化,也越容易滾雪球。 錯的東西一旦寫進這個陣列,之後每一輪都會重送一次。你刪不掉它,只能不要送。
  • 同一個 messages 裡塞進互相矛盾的來源,就是知識衝突。 新舊兩份文件、或是前面幾輪太早給出的答案。
  • system 不直接製造這四種,但它的高度決定了模型在窗口變亂的時候還抓不抓得住重點。

第 4 篇講快取的時候說過「穩定的放前面、易變的放後面」,那是為了省錢。這一篇是同一個結構的另一個理由:那個順序也決定了什麼東西會一直活著。


那窗口裡到底該放什麼

官方文章給的原則只有一句:找出「能讓你想要的結果最可能發生的、最小的高訊號詞元集合」

「最小」不等於「短」,官方特別澄清了這點。落到這一層,有三件事現在就用得上:

  • 提示詞的高度要對。 官方的說法是在兩種失效之間找那個「剛剛好」的區間:一端是寫死的 if-else 邏輯,脆;另一端是空泛的指示,假設模型跟你有共同背景。判準是「具體到足以引導行為,又有彈性到能給出好的經驗法則」。
  • 工具要少而清楚。 官方要求工具彼此功能重疊要最小,並給了一個很好用的判準:如果一個人類工程師都說不出來該用哪個工具,代理也說不出來。 這正好是上面第三種失效的解法。
  • 範例要挑有代表性的,不要窮舉。 官方的說法是給「多樣而典型」的範例,而不是把每一個邊界情況都塞進去。這跟第 3 篇那個少樣本實驗對得起來:範例的作用是交代形狀,不是窮舉規則。

上一篇那個自動切換,就是這句原則的產品版:知識庫大到一個程度,正確的做法本來就不是整份塞進去,而是留著索引、問到才去搜。 產品替你做了這個決定,而這裡是它背後的理由。

只要進窗口的東西是被搜出來的,就會多一個問題:那幾段要不要再排一次序。 檢索給你的是「最像的前幾名」,而最像不等於最有用,所以實務上會多接一個步驟叫重排序(re-ranking),把真正能回答問題的那幾段推到前面。這一步直接決定窗口裡的訊噪比,這一層後面會專門講。

官方還給了壓縮、筆記、子代理三種做法,但那三種分別屬於第四層與第七層,這個系列後面會走到,今天先不展開。

這一篇講的是通用的東西。 注意力預算、四種失效、最小高訊號集合,換成任何一家的模型都成立。Claude 在這裡的角色是量尺:它把窗口上限、usage 的詞元數、快取命中、RAG 切換的標示都做成看得見的東西,所以我可以拿它來示範。分類本身不是它的。


這一層的代價

你要開始為「沒放什麼」負責。 前兩層的失敗看得見:格式不對、規則沒照做。這一層的失敗是沉默的,它會用一樣的語氣,根據不完整的窗口給你一個完整的答案

四種失效的症狀不一樣,解法也不一樣,所以出事的時候第一件事是分類,不是重寫提示詞:

症狀 大概是哪一種 先做什麼
它一直重複同一個錯誤的事實 雪球效應 開新對話,不要在原地追問;記憶開著的話,還要確認那句錯話沒被記下來
對話很長之後開始繞圈、重複動作 長度退化 把任務切段,別讓單一對話無限長
給了工具或資料之後反而變差 可分心性 減少工具與資料,不是增加
前後說法不一致、越問越歪 知識衝突 一次把需求講完,或重開一輪講清楚

最貴的是最後一列。 那篇論文量到的不是「會答錯」,是「變得不穩定」。不穩定的系統沒辦法靠重跑一次來確認,你只會得到另一個樣本。


這一篇多了什麼,又多付了什麼

多了什麼能力:窗口從「能塞多少」變成「該放什麼」,而且出事的時候有四個名字可以分類,不再只能說「它今天怪怪的」。

多付了什麼代價:你要為沒放進去的東西負責;失敗是沉默的;而最麻煩的那一種失效不是答錯,是變得不穩定。


下一篇

檢索是怎麼回事:切塊、向量,找出來而不是記起來。

這一篇說「放最小的高訊號集合」,但沒說那一小段要怎麼找出來。下一篇進這一層的深水區,把檢索拆開:一份文件怎麼被切成塊、一段文字怎麼變成一串數字、「相關」這件事到底是怎麼算出來的。順帶一提,這條路上有一個洞:Anthropic 沒有自己的向量化模型,官方文件自己這樣寫。那一篇會處理這件事。


延伸閱讀


上一篇
建構代理的知識庫:把檔案給它看
下一篇
檢索是怎麼回事:切塊、向量,找出來而不是記起來
系列文
從 LLM 到 Agent:用 Claude 拆解現代 AI 工程的每一層9
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言